/***************************************
Audio Defender by James P
************ THE PUNK DUCK *************
****************************************/

desc: Punk Duck Audio Defender
filename:0,audiodefender_gfx/pinkKnob.png
filename:1,audiodefender_gfx/star.png
filename:2,audiodefender_gfx/bg.png

slider1:30<1, 60, 1>-Interval (s)
slider2:1<0.1, 5, 0.1>-Noise duration (s)
slider3:0<-24,0,1>-Dry Volume during Noise/Tone (dB)
slider4:-6<-24,0,1>-Noise/Duck Volume (dB)
slider5:0<0,3,1{Noise,Tone,Duck/Mute,Stutter}>-Type
slider6:440<100,10000, 1>-Tone frequency (Hz)

@init 
gfx_clear=-1;
gfx_refresh=1;
stutterInterval = 40*srate/1000; // 40ms
lastscreensz=-1; // last size
gfx_a=1;

knob_y=62;
knob_w=65;
knob_h=65;

knob1_x=30;
knob2_x=120;
knob3_x=210;
knob4_x=300;
knob6_x=390;

noisePos = 0;
cpos = 9999999999999999999;

@slider
vnDry= 2^(slider3/6); 
vnNoise= 2^(slider4/6); 
interval_len=srate*slider1;
freqAmt = slider6 * 2.0*$pi/srate;
type = slider5;
noiseStart = srate * slider2;
gfx_refresh = 1;
cpos = interval_len;


@block
noisePos <= 0 ? (
cpos=cpos-samplesblock;
cpos = max(0,cpos);
cpos <= 0 && noisePos <= 0 ? (
noisePos = srate * slider2;
);
)

@sample
noisePos > 0 ? (
noisePos-=1;
noisePos <= 0 ? cpos = interval_len;
vol = vnDry;

(type==0) ? ( // noise
sound = vnNoise * (rand(2)-1);
) :
(type==1) ? ( // sine
sound = vnNoise * cos (freqAmt*noisePos);
) :
(type==2) ? ( // mute/duck
sound = 0;
vol = vnNoise;
) :
(type==3) ? ( // stutter
vol = vnNoise;
div = (noisePos / stutterInterval)%2;
(div==0) ? vol = 1.0;
sound = 0;
);

spl0 = (spl0 * vol) + sound;
spl1 = (spl1 * vol) + sound;

);


@gfx 588 188
gfx_a = 1;
gfx_x = 0; gfx_y = 0;

gfx_refresh == 1 ? (
  gfx_a=1;
  gfx_x=gfx_y=0;
  gfx_blit(2,1,0);
  
   gfx_r=1.0;gfx_g=0.0;gfx_b=1.0;
   
  // draw knobs
    gfx_x=knob1_x;gfx_y=knob_y;
    gfx_blit(0,1, ((slider1-1)/59) * 1.5*$pi);
    gfx_y=130;
    gfx_x+=25;
    gfx_drawnumber(slider1,1);
    
    gfx_x=knob2_x;gfx_y=knob_y;
    gfx_blit(0,1,((slider2-0.1)/4.9) *1.5*$pi);
    gfx_y=130;
    gfx_x+=25;
    gfx_drawnumber(slider2,1);
        
    gfx_x=knob3_x;gfx_y=knob_y;
    gfx_blit(0,1,((slider3+24)/(24)) * 1.5*$pi);
    
    gfx_y=130;
    gfx_x+=25;
    gfx_drawnumber(slider3,1);
    
    gfx_x=knob4_x;gfx_y=knob_y;
    gfx_blit(0,1,((slider4+24)/(24)) * 1.5*$pi);
    gfx_y=130;
    gfx_x+=25;
    gfx_drawnumber(slider4,1);
    
    gfx_x=knob6_x;gfx_y=knob_y;
    gfx_blit(0,1,((slider6-100)/9900) * 1.5*$pi);
    gfx_y=130;
    gfx_x+=25;
    gfx_drawnumber(slider6,0);
 
    gfx_x=505;gfx_y=62 + type * 24;
   gfx_blit(1,1,0);
   gfx_refresh=1;
  );
   mousedown=0;
  (mouse_cap&1) ? (
  gfx_refresh=1;
 
  mouse_y > 40 && mouse_y < 160 ? (
  mouse_x > knob1_x && mouse_x < knob1_x+knob_w ? (mousedown = 1; val=5;) :
  mouse_x > knob2_x && mouse_x < knob2_x+knob_w ? (mousedown = 2; val=0.5;) :
  mouse_x > knob3_x && mouse_x < knob3_x+knob_w ? (mousedown = 3; val=2;):
  mouse_x > knob4_x && mouse_x < knob4_x+knob_w ? (mousedown = 4; val=2;):
  mouse_x > knob6_x && mouse_x < knob6_x+knob_w ? (mousedown = 6; val=1000)
  );
  
  
  
  
mousedown == 0 &&  mouse_x > 490 ? (
  mousedown=5;
  aa = ((mouse_y - 62) / 24) ;
  val = floor(aa);
  val < 0 ? val=slider5;
  val > 3 ? val=slider5;
  );
  
  
   mouse_cap == 5 ? (val /= 4 );  //mouse left button and CTRL key are down (for fine tune)
  )
  :
  (
  mousedown = 0;
 gfx_refresh=0;
  );
  
  cursz = gfx_w * 1000000 + gfx_h; // detect changes in either w or h.
  cursz != lastscreensz ? (
   gfx_refresh=1;
  lastscreensz=cursz;
  );
  
  //set sliders based on mouse location and which direction (up/down)
  //mouse is moving
  
  mousedown == 1 ? (
  mouse_y > save_y ? (slider1 = max(1,slider1-val); );
  mouse_y < save_y ? (slider1 = min(60,slider1+val); );
  save_y=mouse_y;
  );
  
  mousedown == 2 ? (
  mouse_y > save_y ? (slider2 = max(0.1,slider2-val); );
  mouse_y < save_y ? (slider2  = min(5,slider2+val); );
  save_y=mouse_y;
  );
  
  mousedown == 3 ? (
  mouse_y > save_y ? (slider3 = max(-24,slider3-val); );
  mouse_y < save_y ? (slider3 = min(0,slider3+val); );
  save_y=mouse_y;
  );
  mousedown == 4 ? (
  mouse_y > save_y ? (slider4 = max(-24,slider4-val); );
  mouse_y < save_y ? (slider4 = min(0,slider4+val); );
  save_y=mouse_y;
  );
  mousedown == 6 ? (
  mouse_y > save_y ? (slider6 = max(100,slider6-val); );
  mouse_y < save_y ? (slider6 = min(10000,slider6+val); );
  save_y=mouse_y;
  );
  mousedown == 5 ? slider5 = val;
 
  //duplicate setting values in slider section
  mousedown != 0 ? (
  vnDry= 2^(slider3/6); 
  vnNoise= 2^(slider4/6); 
  interval_len=srate*slider1;
  freqAmt = slider6 * 2.0*$pi/srate;
  type = slider5;
  noiseStart = srate * slider2;
  gfx_refresh = 1;
  cpos = interval_len;
  )
